package com.km.team.phsystem.service;

import cn.hutool.core.date.DateTime;
import com.km.team.phsystem.beans.pojo.QueueInfo;
import com.km.team.phsystem.beans.vo.QueueCombinedInformationVo;
import com.km.team.phsystem.beans.vo.QueueInfoVo;
import com.km.team.phsystem.beans.vo.QueueListAndStartTimeToStringVo;

import java.util.Date;
import java.util.List;

/**
 * Author: jiangjun
 * Date: 2018/10/15
 * Time: 下午5:12
 * Description: 排号服务
 */
public interface IQueueService {

    /**
     * 根据电话获取正在排号列表
     *
     * @param mobile
     * @return
     * @throws Exception
     */
    List<QueueInfo> getQueueingByMobileAndBusiness(String mobile) throws Exception;

    /**
     * 根据电话和业务ID获取正在排号列表
     *
     * @param mobile   电话号码
     * @param busiType 业务ID
     * @return
     * @throws Exception
     */
    List<QueueInfo> getQueueingByMobileAndBusiness(String mobile, String busiType) throws Exception;

    /**
     * 排号
     *
     * @param vo
     * @return
     * @throws Exception
     */
    String add(QueueInfoVo vo) throws Exception;


    /**
     * 取消排号
     *
     * @param id
     * @throws Exception
     */
    void cancel(Integer id) throws Exception;

    /**
     * 获取排号初略数据数据
     * 其数据实体为{@link QueueInfo}
     *
     * @param id
     * @return
     * @throws Exception
     */
    QueueInfo getDataById(Integer id) throws Exception;

    /**
     * 排号分配业务人员
     *
     * @param queueId
     * @param userId
     * @throws Exception
     */
    void dispatch(Integer queueId, Integer userId) throws Exception;

    /**
     * 更新排号通知信息
     *
     * @param queueId：排号Id
     * @param queueCode：排号编号
     * @param notifyInfo：通知信息
     * @return
     * @throws Exception
     */
    int updateNotifyInfo(Integer queueId, String queueCode, String notifyInfo) throws Exception;

    /**
     * 根据排号编号查询
     *
     * @param queueCode
     * @return
     * @throws Exception
     */
    QueueInfo getDataByQueueCode(String queueCode) throws Exception;

    /**
     * 根据ID查询详细数据
     * 数由三个数据表组成
     * 由排号数据表{@link QueueInfo} 以及排号所选的日期表{@link com.km.team.phsystem.beans.pojo.DatePhConfig}
     * 以及排号所选的业务类型下的排号时间段表{@link com.km.team.phsystem.beans.pojo.TimeSlotPhConfig} 组成
     * 其中{@link QueueCombinedInformationVo} 对数据进行了封装，组合了{@link QueueInfo}，同时纳入了 日期表的ID 和具体日期
     * 及时段表的ID 和 开始时间和结束时间（时段信息）
     *
     * @param key {@link QueueInfo}的主键
     * @return
     */
    QueueInfo getDataForKey(Integer key);

    /**
     * 根据{@link QueueInfo}的主键跟新排号状态
     *
     * @param queueInfo 数据
     * @return
     */
    int updateQueueStatusForKey(QueueInfo queueInfo);


    /**
     * 根据电话号码查询详细数据
     * 数由三个数据表组成
     * 由排号数据表{@link QueueInfo} 以及排号所选的日期表{@link com.km.team.phsystem.beans.pojo.DatePhConfig}
     * 以及排号所选的业务类型下的排号时间段表{@link com.km.team.phsystem.beans.pojo.TimeSlotPhConfig} 组成
     * 其中{@link QueueCombinedInformationVo} 对数据进行了封装，组合了{@link QueueInfo}，同时纳入了 日期表的ID 和具体日期
     * 及时段表的ID 和 开始时间和结束时间（时段信息）
     *
     * @param mobile {@link QueueInfo}的主键
     * @return
     */
    List<QueueInfo> getDataForMobile(String mobile);


    /**
     * 根据对列ID获组合数
     *
     * @param id
     * @return
     */
    QueueInfo selectQueueById(Integer id);

    /**
     * 根据业务ID列表获取当天所有时段的排号消息
     * 需要更具时段进行分组
     *
     * @param businessIdList 业务ID列表
     * @return
     */
    List<QueueListAndStartTimeToStringVo> queueListByBusinessIdList(List<Integer> businessIdList, String date) throws Exception;

    /**
     * 登记正在办理业务的窗口和对应的排队号
     *
     * @param wind
     * @param id
     */
    void registrationWindAndQueueId(Integer wind, Integer id);

    /**
     * 根据业务查询所有临时预约业务
     *
     * @param idList ID列表
     * @return
     */
    List<QueueInfo> selectTemporaryQueue(List<String> idList,String date) throws Exception;


    /**
     * 根据业务ID获取所有不是最终状态的数据
     *
     * @param businessId
     * @return
     */
    List<QueueInfo> getDateForBusinessId(Integer businessId);

    /**
     * 业务
     * 日期
     * 状体
     * 类型
     * 查询该业务类型下的该日期的排号数量
     *
     * @param businessId
     * @param date
     * @return
     */
    Long selectQueueNumFotBusinessIdAndDate(Integer businessId, Date date);

    /**
     * 业务
     * 日期
     * 类型
     * 状态
     * 时间
     * 查询该业务下的该类型的该日期的该时段的排号数量
     *
     * @param businessId
     * @param date
     * @param timeSlotId
     * @return
     */
    Long selectQueueNumFotBusinessIdAndDateAndTimeSlot(Integer businessId, Date date, Integer timeSlotId);

    /**
     * 获取当前时间的队列
     * 直到有值或者时段结束
     *
     * @param idList
     * @return
     */
    QueueListAndStartTimeToStringVo getNowTimeQueueList(List<String> idList,String windowId, Date dateTime);

    /**
     * 更具时间查询所有改天以后的排号情况
     * @param beginOfDay
     * @return
     */
    List<QueueInfo> selectDataForDateAfter(Integer businessId,DateTime beginOfDay);
}
